import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator'
// 自定义验证装饰器：IsLongerThan(比较两者之间的长度)

// 当前装饰器应用的属性名要大于property的长度
// property: 需要进行比较的另一字段名；validationOptions（可选）：是一个配置对象，用于传递额外的验证选项，比如自定义错误消息
export function IsLongerThan(property: string, validationOptions?: ValidationOptions) {
  return function (object: object, propertyName: string) {
    registerDecorator({
      //registerDecorator: 用来将自定义验证器注册到类的属性上。它接受一个配置对象,如下
      name: 'isLongerThan', // 装饰器的名字
      target: object.constructor, //目标对象的构造函数
      propertyName: propertyName, // 当前装饰器应用的属性名。
      constraints: [property], //一个数组，包含了验证器所需的参数
      options: validationOptions, // 验证选项，包括自定义的错误信息等。
      validator: {
        /*validator: 定义验证逻辑的对象
        validate(value, args): 验证函数，判断当前字段的值是否符合验证规则
        defaultMessage(args): 提供验证失败时的默认错误消息
        验证逻辑
            validate 方法中：
            value: 当前字段的值。//当前装饰器应用的属性的值
            args.constraints: 这是一个数组，其中第一个元素就是要进行比较的字段的名字。
            args.object: 目标对象，它包含了所有字段数据，通过这个对象你可以访问其他字段的值。 
        */
        validate(value: any, args: ValidationArguments) {
          const [relatedPropertyName] = args.constraints as string[]
          const object = args.object as Record<string, unknown>
          const relatedValue =
            typeof object[relatedPropertyName] === 'string' ? object[relatedPropertyName] : ''
          return (
            typeof value === 'string' &&
            typeof relatedValue === 'string' &&
            value.length > relatedValue.length
          ) // 如果你想进行异步验证，你也可以在这里返回一个 Promise<boolean>。
        }
      }
    })
  }
}
